﻿#pragma once

#include <iostream>
#include <vector>

namespace libdaq {
namespace device {
namespace command {

/**
 * @brief 基本信息（用户只读）
 */
enum class BasicInformation {
  DeviceType = 0x0000,               /// 获取设备类型
  DeviceHardwareVersion = 0x0001,    /// 获取硬件版本
  DeviceBootLoaderVersion = 0x0002,  /// 获取BootLoader版本
  DeviceSoftwareVersion = 0x0003,    /// 获取软件版本
  DeviceSetHardwareVersion = 0x0004,  /// 设置硬件版本
};

enum class CollectionControl{
  StartCollection = 0x0100,   ///<开始采集
  StopCollection = 0x0101,    ///<停止采集
  ForceStopCollection = 0x8101, ///<强制停止采集
};


/**
 * @brief ADC配置
 */
enum class ADCConfiguration {
  ConfigTriggerSource = 0x0110, ///<设置触发源
  ConfigSampleRate = 0x0200,  ///<设置采样率
  ConfigRange = 0x0201,       ///<设置量程
  ConfigChannel = 0x020A,     ///<通道使能
  ConfigTrigger = 0x0210,     ///<设置触发方式

  ConfigCalibration = 0x0230,     ///< 启动校正
  OffsetCalibrationX1 = 0x0231,      ///< 偏移校正参数（x1档）
  GetOffsetCalibrationX1 = 0x0232,   ///< 获取偏移校正参数（x1档）
  OffsetCalibrationX10 = 0x0233,     ///< 偏移校正参数（x10档）
  GetOffsetCalibrationX10 = 0x0234,  ///< 获取偏移校正参数（x10档）
  GainCalibrationX1 = 0x0239,        ///< 增益校正参数（x1档）
  GetGainCalibrationX1 = 0x023A,     ///< 获取增益校正参数（x1档）
  GainCalibrationX10 = 0x023B,       ///< 增益校正参数（x10档）
  GetGainCalibrationX10 = 0x023C,    ///< 获取增益校正参数（x10档）
  
  SaveOffsetCalibration50MX1 = 0x0281,///< 保存偏移校正参数（50M x1档）
  SaveOffsetCalibration100MX1 = 0x0291,///< 保存偏移校正参数（100M x1档）
  SaveOffsetCalibration125MX1 = 0x02A1,///< 保存偏移校正参数（125M x1档）
  SaveOffsetCalibration50MX10 = 0x0283,///< 保存偏移校正参数（50M x10档）
  SaveOffsetCalibration100MX10 = 0x0293,///< 保存偏移校正参数（100M x10档）
  SaveOffsetCalibration125MX10 = 0x02A3,///< 保存偏移校正参数（125M x10档）
  SaveGainCalibration50MX1 = 0x0289,///< 保存增益校正参数（50M x1档）
  SaveGainCalibration100MX1 = 0x0299,///< 保存增益校正参数（100M x1档）
  SaveGainCalibration125MX1 = 0x02A9,///< 保存增益校正参数（125M x1档）
  SaveGainCalibration50MX10 = 0x028B,///< 保存增益校正参数（50M x1档）
  SaveGainCalibration100MX10 = 0x029B,///< 保存增益校正参数（100M x1档）
  SaveGainCalibration125MX10 = 0x02AB,///< 保存增益校正参数（125M x1档）

  OpenOffsetCalibrationX1 = 0x025A,  ///< 打开偏移校正电路（x1档）
  OpenOffsetCalibrationX10 = 0x025C, ///< 打开偏移校正电路（x10档）
  OpenGainCalibrationX1 = 0x025B,    ///< 打开增益校正电路（x1档）
  OpenGainCalibrationX10 = 0x025D,   ///< 打开增益校正电路（x10档）

  CloseCalibration = 0x0350,         ///< 关闭校正电路
  ConfigACDC = 0x020B,               ///< AC/DC
  ConfigReceiveDataLength = 0x0211,  ///< 设置单次采集时获取的数据长度（单通道），以“数据点”为单位
  ConfigTriggerTimeout = 0x0212,     ///< 自动触发的超时时间，单位ms
  ConnectDevice = 0x02FF,            ///< 连接设备（设置设备地址，打开设备时进行）
  DisconnectDevice = 0x02FE,         ///< 断开连接
};

/**
 * @brief 系统操作（用户可读可写）
 */
enum class SystemOperation {
    ResetByFPGA = 0x0301,                 ///<mcu/fpga复位设备
    RestoreFactoryConfiguration = 0x0311, ///<恢复出厂设备
    UpdateFirmware = 0x0321,              ///<更新固件
    EraseFirmware = 0x0322,               ///<擦除固件
    SendFirmware = 0x0333,                ///<下发固件
    SetDeviceAddr = 0x0337,               ///<设置设备地址
    FirmwareInfo = 0x033D,                ///<固件信息
    InquireMCUMode = 0X033E,              ///<查询下位机是否在升级模式
    GetDeviceAddr = 0x033F,               ///<获取设备地址
    GetDeviceName = 0x0340,               ///<读取设备名称
    SetDeviceName = 0x0341,               ///<更改设备名称
    GetDeviceMacAddr = 0x0342,            ///<获取MAC地址
    SetDeviceMacAddr = 0x0343,            ///<设置MAC地址
    GetDeviceNetInfo = 0x0344,            ///<获取板卡网络信息
    SetDeviceNetInfo = 0x0345,            ///<设置板卡网络信息
    GetServerInfo = 0x0346,               ///<获取服务器信息
    SetServerInfo = 0x0347,               ///<设置服务器信息
    ConnectDevice = 0x03FF,               ///<连接设备
    DisconnectDevice = 0x03FE,            ///<断开连接
    ResetByUSB = 0x0302,
};

/**
 * @brief DAC配置
 */
enum class DACConfiguration {
  ConfigDACMode = 0X0400,  ///< 设置DAC通道，模式，数据
  ConfigDACData = 0X0403,  ///< 设置DAC通道，模式，数据
  StartDAC = 0x0401,   ///< 启动DAC
  StopDAC = 0x0402,    ///< 停止DAC
};

/**
 * @brief DIO配置
 */
enum class GPIOConfiguration {
  SetGPO = 0x0500,  ///< 设置GPO，单次操作
  GetGPI = 0x0501,  ///< 获取GPI状态
  SetGPI = 0x0502,  ///< 配置GPO工作模式
  ClearGPICount = 0x0503, ///< 清除GPO计数值
};

/**
 * @brief PWM配置
 */
enum class PWMConfiguration {
  ConfigPWM = 0x0600,  ///< 配置PWM
  StartPWM = 0x0601,   ///< 启动PWM
  StopPWM = 0x0602,    ///< 停止PWM
};

/**
 * @brief 计数器配置
 */
enum class CounterConfiguration {
  ConfigCounter = 0x0700,  ///< 配置计数器
  GetCounter = 0x0701,     ///< 获取计数值
  ClearCounter = 0x0702,   ///< 清零计数值
  StartCounter = 0x0703,   ///< 启动计数器
  StopCounter = 0x0704,    ///< 停止计数器
};

enum class RTCConfiguration {
  SetRTC = 0x0A00,
  GetRTC = 0x0A01,
};

/**
 * @brief 生产测试（内部）
 * @attention 该部分命令仅供内部测试
 */
enum class ProductionTestingConfiguration {
    GetDefaultConfig = 0x0B04,    ///< 读取默认配置
    SetSN = 0x0B06,               ///< 设置SN
    GetSN = 0x0B07,               ///< 获取SN
    GetEepromUID = 0x0B0A,        ///< 读取eeprom中的UID号
    SetEepromUIDVerify = 0x0B0B,  ///< 开启验证UID
};
}  // namespace command
}  // namespace device
}  // namespace libdaq
